﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;
using Persistence;

namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Empresa
    /// </summary>
    
    public class GerenciadorEmpresa

    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorEmpresa()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorEmpresa(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="empresaModel">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(Empresa empresaModel)
        {
            TB_EMPRESA empresaE = new TB_EMPRESA();
            Atribuir(empresaModel, empresaE);
            unitOfWork.RepositorioEmpresa.Inserir(empresaE);
            unitOfWork.Commit(shared);
            return empresaE.id_Empresa;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="empresaModel"></param>
        public void Editar(Empresa empresaModel)
        {
            TB_EMPRESA empresaE = new TB_EMPRESA();
            Atribuir(empresaModel, empresaE);
            unitOfWork.RepositorioEmpresa.Editar(empresaE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="empresaModel"></param>
        public void Remover(int idEmpresa)
        {
            unitOfWork.RepositorioEmpresa.Remover(empresa => empresa.id_Empresa.Equals(idEmpresa));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do empresa como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<Empresa> GetQuery()
        {
            IQueryable<TB_EMPRESA> TB_EMPRESA = unitOfWork.RepositorioEmpresa.GetQueryable();
            var query = from empresa in TB_EMPRESA 
                        select new Empresa
                        {
                            Id_Empresa = empresa.id_Empresa,
                            Nome = empresa.nome,
                            Cnpj = empresa.cnpj,
                            Bairro = empresa.bairro,
                            Cidade = empresa.cidade,
                            Estado = empresa.estado,
                            Numero = empresa.numero,
                            Rua = empresa.rua,
                            Cep = empresa.cep,
                            RazaoSocial = empresa.razaoSocial,
                            Telefone = empresa.telefone,

                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Empresa> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um empresa
        /// </summary>
        /// <param name="idEmpresa">Identificador do empresa na base de dados</param>
        /// <returns>Empresa model</returns>
        public Empresa Obter(int idEmpresa)
        {
            IEnumerable<Empresa> empresas = GetQuery().Where(empresaModel => empresaModel.Id_Empresa.Equals(idEmpresa));
            return empresas.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do Empresa Model para o Empresa Entity
        /// </summary>
        /// <param name="empresaModel">Objeto do modelo</param>
        /// <param name="empresaE">Entity mapeada da base de dados</param>
        private void Atribuir(Empresa EmpresaModel, TB_EMPRESA empresaE)
        {
            empresaE.id_Empresa = EmpresaModel.Id_Empresa;
            empresaE.nome = EmpresaModel.Nome;
            empresaE.cnpj = EmpresaModel.Cnpj;
            empresaE.bairro = EmpresaModel.Bairro;
            empresaE.cidade = EmpresaModel.Cidade;
            empresaE.estado = EmpresaModel.Estado;
            empresaE.numero = EmpresaModel.Numero;
            empresaE.rua = EmpresaModel.Rua;
            empresaE.cep = EmpresaModel.Cep;
            empresaE.razaoSocial = EmpresaModel.RazaoSocial;
            empresaE.telefone = EmpresaModel.Telefone;

        }

    }
}
